use std::sync::Arc;
use arc_swap::ArcSwap;
use crate::vm::Value;
use crate::error::Result;

/// 无锁的共享数据结构，基于 `arc-swap`，可在多个 VM/线程之间高效共享 Value
#[derive(Debug, Clone)]
pub struct SharedData {
    inner: Arc<ArcSwap<Value>>,
}

impl SharedData {
    /// 创建新的共享数据
    pub fn new(value: Value) -> Self {
        SharedData {
            inner: Arc::new(ArcSwap::from_pointee(value)),
        }
    }

    /// 克隆共享数据引用（廉价，增加引用计数）
    pub fn clone_ref(&self) -> Self {
        SharedData { inner: Arc::clone(&self.inner) }
    }

    /// 获取内部值的克隆（无锁读取）
    pub fn get(&self) -> Result<Value> {
        let arc = self.inner.load_full();
        Ok(arc.as_ref().clone())
    }

    /// 原子地替换内部值（无锁写入）
    pub fn set(&self, value: Value) -> Result<()> {
        self.inner.store(Arc::new(value));
        Ok(())
    }
}

impl PartialEq for SharedData {
    fn eq(&self, other: &Self) -> bool {
        let a = self.inner.load();
        let b = other.inner.load();
        Arc::ptr_eq(&a, &b)
    }
}

impl Eq for SharedData {}